package org.yzhzc.system.manager;

import org.yzhzc.common.core.constants.CacheConstants;
import org.yzhzc.common.redis.service.RedisService;
import org.yzhzc.system.domain.exam.entity.Exam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 竞赛缓存管理器，用于操作 Redis 中与竞赛相关的数据缓存。
 * 主要负责添加和删除竞赛的缓存数据，包括竞赛列表、竞赛详情、竞赛题目列表等。
 */
@Component
public class ExamCacheManager {

    @Autowired
    private RedisService redisService;

    /**
     * 将竞赛信息添加到 Redis 缓存中。
     *
     * @param exam 竞赛实体对象，包含竞赛的详细信息
     * 该方法将竞赛信息添加到 Redis 的多个缓存项中，包括竞赛ID到竞赛列表、竞赛详情以及竞赛题目列表等。
     */
    public void addCache(Exam exam) {
        // 将竞赛ID添加到未完成的竞赛列表中
        redisService.leftPushForList(this.getExamListKey(), exam.getExamId());

        // 将竞赛详情存储到 Redis 中
        redisService.setCacheObject(this.getDetailKey(exam.getExamId()), exam);
    }


    /**
     * 从 Redis 缓存中删除指定的竞赛信息。
     *
     * @param examId 竞赛ID
     * 该方法从 Redis 中删除与竞赛相关的所有缓存数据，包括竞赛ID、竞赛详情以及与该竞赛相关的题目列表。
     */
    public void deleteCache(Long examId) {
        // 从未完成的竞赛列表中删除指定的竞赛ID
        redisService.removeForList(this.getExamListKey(), examId);

        // 删除竞赛详情缓存
        redisService.deleteObject(this.getDetailKey(examId));

        // 删除与竞赛相关的题目列表缓存
        redisService.deleteObject(this.getExamQuestionListKey(examId));
    }

    /**
     * 获取未完成竞赛列表的缓存键
     *
     * @return 未完成竞赛列表的缓存键
     */
    private String getExamListKey() {
        return CacheConstants.EXAM_UNFINISHED_LIST;
    }

    /**
     * 获取竞赛详情的缓存键
     *
     * @param examId 竞赛ID
     * @return 竞赛详情的缓存键
     */
    private String getDetailKey(Long examId) {
        return CacheConstants.EXAM_DETAIL + examId;
    }

    /**
     * 获取与竞赛相关的题目列表缓存键
     *
     * @param examId 竞赛ID
     * @return 与竞赛相关的题目列表缓存键
     */
    private String getExamQuestionListKey(Long examId) {
        return CacheConstants.EXAM_QUESTION_LIST + examId;
    }
}
